#include <iostream>
using namespace std;
#include "vector"
#include "algorithm"

//容器中 装基础数据类型变量
void test()
{
        //用来盛int类型的数据 相当于数组
        vector<int> v1;//1 容器:把你的元素copy到容器中
        v1.push_back(-1);
        v1.push_back(1);
        v1.push_back(3);
        v1.push_back(3);
        v1.push_back(5);

        //访问容器
        //1 3 5
        //2 迭代器相当于一个指针,指针指向元素1
        for ( vector<int>::iterator it = v1.begin(); it != v1.end() ; it++)
        {
                cout<<*it<<" ";
        }
        cout<<endl;
        
        //3 算法的概念 排序 统计 查找....
        //算法和迭代器 进行无缝的连接
        int num1 = count(v1.begin(), v1.end(), 3); //统计元素3的个数 迭代器的开始位置到迭代器的结束位置
        cout<<"num1: "<<num1<<endl;   
}

class Teacher
{
public:
        int age;
        char name[64];
public:
        void printT()
        {
                cout<<"age: "<<age<<endl;
        }
};

//容器中 装元素
void test2()
{
        Teacher t1,t2,t3;
        t1.age = 31;
        t2.age = 32;
        t3.age = 33;

        vector<Teacher> v1; //1.容器实现了数据类型和算法的有效分离
        v1.push_back(t1);
        v1.push_back(t2);
        v1.push_back(t3);

        for (vector<Teacher>::iterator it = v1.begin(); it != v1.end(); it++)
        {
                cout<<it->age<<" ";
        }
        cout<<endl;      
}

//容器中 装指针
void test3()
{
        Teacher t1,t2,t3;
        t1.age = 31;
        t2.age = 32;
        t3.age = 33;

        Teacher *p1,*p2,*p3;
        p1 = &t1;
        p2 = &t2;
        p3 = &t3;

        vector<Teacher *> v1; //把t1,t2,t3内存首地址 copy一份放入到了容器
        v1.push_back(p1);
        v1.push_back(p2);
        v1.push_back(p3);

        for (vector<Teacher *>::iterator it = v1.begin(); it != v1.end(); it++)
        {
                cout<<(*it)->age<<" ";
        }
        cout<<endl;      

        //如何求 容器 中 老师年龄=33 名字都姓jhon 的个数
}


//数据结构: 研究节点(struct)与节点(struct)之间的关系
//节点之间的关系有哪些? 集合 数组(1:1) 链表 树(1:n) 图(n:n)
//可以将数据结构的这些关系映射对应到对应的容器
//vector 对应的数据结构是  数组
//deque 双端数组
//list 双向链表
//set(唯一)/multiset(可以不唯一) 集合
//map/multimap 结合
int main(int argc, char const *argv[])
{
        //test();
        //test2();
        test3();
        return 0;
}